//
// 队列
// Created by 麻再挺 on 2021/12/8.
//

#ifndef DATA_STRUCTURE_C_QUEUE_H
#define DATA_STRUCTURE_C_QUEUE_H
#include <stdio.h>
#include <stdlib.h>
#include "./../constant.h"

/**
 * 队列类型
 */
typedef void* QElemType;

/**
 * 队列结点
 */
typedef struct QNode {
    // 数据
    QElemType data;
    // 下一个节点
    struct QNode *next;
}QNode, *QueueStr;

/**
 * 链表队列
 */
typedef struct {
    /**
     * 队头指针
     */
    QueueStr front;
    /**
     * 队尾指针
     */
    QueueStr rear;
}LinkQueue;

/**
 * 初始化队列
 */
Status Link_Queue_Init(LinkQueue *queue);

/**
 * 销毁队列
 */
Status Link_Queue_Destroy(LinkQueue *queue);

/**
 * 清空队列
 */
Status Link_Queue_Clear(LinkQueue *queue);

/**
 * 判断队列是否为空
 */
Status Link_Queue_Empty(LinkQueue *queue);

/**
 * 队列长度
 */
int Link_Queue_Length(LinkQueue *queue);

/**
 * 获取队列头
 * @param queue 队列
 * @param elem 元素
 * @return
 */
Status Link_Queue_GetHead(LinkQueue *queue, QElemType *elem);

/**
 * 入队
 * @param queue 队列
 * @return
 */
Status Link_Queue_Enter(LinkQueue *queue, QElemType elem);

/**
 * 出队
 * @param queue 队列
 * @param elem 元素
 * @return
 */
Status Link_Queue_Deter(LinkQueue *queue, QElemType *elem);

/**
 * 队列打印
 * @param queue 队列
 */
void Link_Queue_Print(LinkQueue *queue);

#endif //DATA_STRUCTURE_C_QUEUE_H
